Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_schema_migration_matrix.py

Displaying Raw • Download


tests/backend/test_schema_migration_matrix.py 6d6b40536aa49435a195fce36c4c3e4b8d96c738 (6d6b4053) Text, 4.89 KB

T8b949e# SPDX-License-Identifier: 0BSD

T8b949e"""Upgrade matrix: open schema_v{N-1} and schema_v{N-2} fixtures, run Database.initialize()."""

Tff7b72from T7ee787__future__ Tff7b72import Te6edf3annotations

Tff7b72import T7ee787json
Tff7b72import T7ee787shutil
Tff7b72import T7ee787tempfile
Tff7b72import T7ee787os
Tff7b72from T7ee787pathlib Tff7b72import Te6edf3Path
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3patch

Tff7b72import T7ee787pytest
Tff7b72from T7ee787hypothesis Tff7b72import Te6edf3HealthCheckTb4b4b4, Te6edf3givenTb4b4b4, Te6edf3settings
Tff7b72from T7ee787hypothesis Tff7b72import Te6edf3strategies Tff7b72as Te6edf3st

Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787database Tff7b72import Tb4b4b4(
Te6edf3DatabaseTb4b4b4,
Te6edf3DatabaseTooNewErrorTb4b4b4,
Te6edf3PostMigrationVerificationErrorTb4b4b4,
Tb4b4b4)
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787databaseT7ee787.T7ee787provider Tff7b72import Te6edf3DatabaseProvider
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787databaseT7ee787.T7ee787schema Tff7b72import Te6edf3DatabaseSchema

Te6edf3FIXTURE_DIR Tff7b72= Te6edf3PathTb4b4b4(Tff7b72__file__Tb4b4b4)Tff7b72.Td2a8ffresolveTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffparent Tff7b72/ Ta5d6ff"Ta5d6fffixturesTa5d6ff" Tff7b72/ Ta5d6ff"Ta5d6ffschema_versionsTa5d6ff"
Te6edf3MANIFEST Tff7b72= Te6edf3FIXTURE_DIR Tff7b72/ Ta5d6ff"Ta5d6ffmanifest.jsonTa5d6ff"


Tf0883e@pytestTff7b72.Td2a8fffixtureTb4b4b4(Te6edf3autouseTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72def Td2a8ffreset_providerTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3DatabaseProviderTff7b72.Td2a8ff_instance Tff7b72= Tff7b72None
Tff7b72yield
Tff7b72if Te6edf3DatabaseProviderTff7b72.Td2a8ff_instance Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3DatabaseProviderTff7b72.Td2a8ff_instanceTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)
Te6edf3DatabaseProviderTff7b72.Td2a8ff_instance Tff7b72= Tff7b72None


Tff7b72def Td2a8ff_fixture_pathTb4b4b4(Te6edf3versionTb4b4b4: Tffa657intTb4b4b4) Tff7b72-Tff7b72> Te6edf3PathTb4b4b4:
Te6edf3path Tff7b72= Te6edf3FIXTURE_DIR Tff7b72/ Ta5d6fffTa5d6ff"Ta5d6ffschema_vTffd700{Te6edf3versionTffd700}Ta5d6ff.dbTa5d6ff"
Tff7b72if Tff7b72not Te6edf3pathTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffMissing fixture Tffd700{Te6edf3pathTffd700}Ta5d6ff; run scripts/ci/schema_fixture_generate.pyTa5d6ff"
Tb4b4b4)
Tff7b72return Te6edf3path


Tff7b72def Td2a8fftest_manifest_matches_latest_versionTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3MANIFESTTff7b72.Td2a8ffis_fileTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6ff"Ta5d6ffschema fixture manifest missingTa5d6ff"Tb4b4b4)
Te6edf3data Tff7b72= Te6edf3jsonTff7b72.Td2a8ffloadsTb4b4b4(Te6edf3MANIFESTTff7b72.Td2a8ffread_textTb4b4b4(Te6edf3encodingTff7b72=Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72assert Tffa657intTb4b4b4(Te6edf3dataTb4b4b4[Ta5d6ff"Ta5d6fflatest_versionTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72== Te6edf3DatabaseSchemaTff7b72.Td2a8ffLATEST_VERSION


Tf0883e@pytestTff7b72.Td2a8ffmarkTff7b72.Td2a8ffparametrizeTb4b4b4(
Ta5d6ff"Ta5d6ffoffsetTa5d6ff"Tb4b4b4,
Tb4b4b4[T79c0ff1Tb4b4b4, T79c0ff2Tb4b4b4]Tb4b4b4,
Te6edf3idsTff7b72=Tb4b4b4[Ta5d6ff"Ta5d6ffn_minus_1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffn_minus_2Ta5d6ff"Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_fixture_upgrades_to_latestTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3offsetTb4b4b4)Tb4b4b4:
Te6edf3target_fixture Tff7b72= Te6edf3DatabaseSchemaTff7b72.Td2a8ffLATEST_VERSION Tff7b72- Te6edf3offset
Tff7b72if Te6edf3target_fixture Tff7b72< T79c0ff1Tb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6ff"Ta5d6ffNo fixture for this offsetTa5d6ff"Tb4b4b4)
Te6edf3src Tff7b72= Te6edf3_fixture_pathTb4b4b4(Te6edf3target_fixtureTb4b4b4)
Te6edf3db_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6fflive.dbTa5d6ff"
Te6edf3shutilTff7b72.Td2a8ffcopy2Tb4b4b4(Te6edf3srcTb4b4b4, Te6edf3db_pathTb4b4b4)
Te6edf3db Tff7b72= Te6edf3DatabaseTb4b4b4(Tffa657strTb4b4b4(Te6edf3db_pathTb4b4b4)Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Te6edf3row Tff7b72= Te6edf3dbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT value FROM config WHERE key = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdatabase_versionTa5d6ff"Tb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72assert Tffa657intTb4b4b4(Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72== Te6edf3DatabaseSchemaTff7b72.Td2a8ffLATEST_VERSION
Te6edf3rows Tff7b72= Te6edf3dbTff7b72.Td2a8ffproviderTff7b72.Td2a8ffquick_checkTb4b4b4(Tb4b4b4)
Tff7b72assert Tb4b4b4(
Te6edf3rows
Tff7b72and Tb4b4b4(Te6edf3rowsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4] Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3rowsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Tffa657dictTb4b4b4) Tff7b72else Tffa657listTb4b4b4(Te6edf3rowsTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72== Ta5d6ff"Ta5d6ffokTa5d6ff"
Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_fixture_upgrade_writes_pre_migrate_backupTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3ver Tff7b72= Te6edf3DatabaseSchemaTff7b72.Td2a8ffLATEST_VERSION Tff7b72- T79c0ff1
Tff7b72if Te6edf3ver Tff7b72< T79c0ff1Tb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6ff"Ta5d6ffNo N-1 fixtureTa5d6ff"Tb4b4b4)
Te6edf3src Tff7b72= Te6edf3_fixture_pathTb4b4b4(Te6edf3verTb4b4b4)
Te6edf3identity_dir Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffidentityTa5d6ff"
Te6edf3identity_dirTff7b72.Td2a8ffmkdirTb4b4b4(Tb4b4b4)
Te6edf3db_path Tff7b72= Te6edf3identity_dir Tff7b72/ Ta5d6ff"Ta5d6ffdatabase.dbTa5d6ff"
Te6edf3shutilTff7b72.Td2a8ffcopy2Tb4b4b4(Te6edf3srcTb4b4b4, Te6edf3db_pathTb4b4b4)
Te6edf3db Tff7b72= Te6edf3DatabaseTb4b4b4(Tffa657strTb4b4b4(Te6edf3db_pathTb4b4b4)Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Te6edf3backups Tff7b72= Te6edf3dbTff7b72.Td2a8fflist_auto_backupsTb4b4b4(Tffa657strTb4b4b4(Te6edf3identity_dirTb4b4b4)Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657anyTb4b4b4(Ta5d6ff"Ta5d6ffbackup-pre-migrateTa5d6ff" Tff7b72in Te6edf3bTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72for Te6edf3b Tff7b72in Te6edf3backupsTb4b4b4)


Tff7b72def Td2a8fftest_post_migration_verify_failure_blocks_version_bumpTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3db_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffverify.dbTa5d6ff"
Te6edf3db Tff7b72= Te6edf3DatabaseTb4b4b4(Tffa657strTb4b4b4(Te6edf3db_pathTb4b4b4)Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffschemaTff7b72.Td2a8ff_create_initial_tablesTb4b4b4(Tb4b4b4)
Te6edf3prior Tff7b72= Te6edf3DatabaseSchemaTff7b72.Td2a8ffLATEST_VERSION Tff7b72- T79c0ff1
Tff7b72if Te6edf3prior Tff7b72< T79c0ff1Tb4b4b4:
Te6edf3pytestTff7b72.Td2a8ffskipTb4b4b4(Ta5d6ff"Ta5d6ffNo prior versionTa5d6ff"Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffschemaTff7b72.Td2a8ffmigrate_up_toTb4b4b4(Te6edf3priorTb4b4b4)
Tff7b72with Te6edf3patchTff7b72.Td2a8ffobjectTb4b4b4(
Te6edf3dbTff7b72.Td2a8ffproviderTb4b4b4, Ta5d6ff"Ta5d6ffquick_checkTa5d6ff"Tb4b4b4, Te6edf3return_valueTff7b72=Tb4b4b4[Tb4b4b4{Ta5d6ff"Ta5d6ffquick_checkTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6fffailTa5d6ff"Tb4b4b4}Tb4b4b4]
Tb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3PostMigrationVerificationErrorTb4b4b4)Tb4b4b4:
Te6edf3dbTff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Te6edf3row Tff7b72= Te6edf3dbTff7b72.Td2a8ffproviderTff7b72.Td2a8fffetchoneTb4b4b4(
Ta5d6ff"Ta5d6ffSELECT value FROM config WHERE key = ?Ta5d6ff"Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdatabase_versionTa5d6ff"Tb4b4b4,Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72assert Tffa657intTb4b4b4(Te6edf3rowTb4b4b4[Ta5d6ff"Ta5d6ffvalueTa5d6ff"Tb4b4b4]Tb4b4b4) Tff7b72== Te6edf3prior
Te6edf3dbTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)


Tff7b72def Td2a8fftest_database_too_new_refuses_initializeTb4b4b4(Te6edf3tmp_pathTb4b4b4)Tb4b4b4:
Te6edf3db_path Tff7b72= Te6edf3tmp_path Tff7b72/ Ta5d6ff"Ta5d6ffnew.dbTa5d6ff"
Te6edf3db Tff7b72= Te6edf3DatabaseTb4b4b4(Tffa657strTb4b4b4(Te6edf3db_pathTb4b4b4)Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffschemaTff7b72.Td2a8ff_create_initial_tablesTb4b4b4(Tb4b4b4)
Te6edf3future Tff7b72= Te6edf3DatabaseSchemaTff7b72.Td2a8ffLATEST_VERSION Tff7b72+ T79c0ff1
Te6edf3dbTff7b72.Td2a8ffproviderTff7b72.Td2a8ffexecuteTb4b4b4(
Ta5d6ff"Ta5d6ffINSERT INTO config (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.valueTa5d6ff"Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdatabase_versionTa5d6ff"Tb4b4b4, Tffa657strTb4b4b4(Te6edf3futureTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72with Te6edf3pytestTff7b72.Td2a8ffraisesTb4b4b4(Te6edf3DatabaseTooNewErrorTb4b4b4)Tb4b4b4:
Te6edf3dbTff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)


Tf0883e@settingsTb4b4b4(
Te6edf3deadlineTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3max_examplesTff7b72=T79c0ff40Tb4b4b4,
Te6edf3suppress_health_checkTff7b72=Tb4b4b4[Te6edf3HealthCheckTff7b72.Td2a8fffunction_scoped_fixtureTb4b4b4]Tb4b4b4,
Tb4b4b4)
Tf0883e@givenTb4b4b4(
Te6edf3bogusTff7b72=Te6edf3stTff7b72.Td2a8fftextTb4b4b4(
Te6edf3alphabetTff7b72=Te6edf3stTff7b72.Td2a8ffcharactersTb4b4b4(Te6edf3blacklist_categoriesTff7b72=Tb4b4b4(Ta5d6ff"Ta5d6ffCsTa5d6ff"Tb4b4b4,Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3min_sizeTff7b72=T79c0ff0Tb4b4b4,
Te6edf3max_sizeTff7b72=T79c0ff12Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8fftest_bogus_database_version_config_does_not_crash_initializeTb4b4b4(Te6edf3bogusTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3bogusTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffisdigitTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3bogus Tff7b72= Ta5d6ff"Ta5d6ffxTa5d6ff"
Te6edf3dir_path Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Tb4b4b4)
Te6edf3db_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3dir_pathTb4b4b4, Ta5d6ff"Ta5d6ffbogus.dbTa5d6ff"Tb4b4b4)
Te6edf3db Tff7b72= Te6edf3DatabaseTb4b4b4(Tffa657strTb4b4b4(Te6edf3db_pathTb4b4b4)Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffschemaTff7b72.Td2a8ff_create_initial_tablesTb4b4b4(Tb4b4b4)
Te6edf3dbTff7b72.Td2a8ffproviderTff7b72.Td2a8ffexecuteTb4b4b4(
Ta5d6ff"Ta5d6ffINSERT INTO config (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.valueTa5d6ff"Tb4b4b4,
Tb4b4b4(Ta5d6ff"Ta5d6ffdatabase_versionTa5d6ff"Tb4b4b4, Te6edf3bogusTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3dbTff7b72.Td2a8ffinitializeTb4b4b4(Tb4b4b4)
Tff7b72except Tb4b4b4(Tf85149ValueErrorTb4b4b4, Te6edf3PostMigrationVerificationErrorTb4b4b4, Te6edf3DatabaseTooNewErrorTb4b4b4)Tb4b4b4:
Tff7b72pass
Tff7b72finallyTb4b4b4:
Te6edf3dbTff7b72.Td2a8ffclose_allTb4b4b4(Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────